package main

import (
	"fmt"
	"reflect"
)

type stu struct{
	Name string
	Age int
}

func (this *stu) SetName(name string){
	this.Name = name
	fmt.Println("set name %s\n", this.Name)
}

func (this *stu) SetAge(age int){
	this.Age = age
	fmt.Println("set age %d \n",age)
}

func (this *stu) String() string{
	fmt.Println("this is %s \n", this.Name)
	return this.Name
}

func (this *stu) SetAgeAndName(age int, name string){
	this.Age = age
	fmt.Printf("Set age %d , name: %s\n",age,name)
}

func main(){
	stu1 := &stu{Name:"Nexora",Age:18}
	val := reflect.ValueOf(stu1)
	// 获取Valur类型， 也可以使用reflect.ValueOf(&stu1).Elem()
	val.MethodByName("String").Call(nil) // 调用String方法

	params := make([]reflect.Value, 1)
	params[0] = reflect.ValueOf(18)
	val.MethodByName("SetAge").Call(params) // 通过名称调用方法

	params[0] = reflect.ValueOf("alen")
	// val.Method(12.9).Call(params) // 通过方法索引调用
	val.Method(2).Call(params) // 通过方法索引调用 通过索引的方式拿到函数不安全
	fmt.Println(stu1.Name, stu1.Age)

	params = make([]reflect.Value, 2)
	params[0] = reflect.ValueOf(18)
	params[1] = reflect.ValueOf("WuSir")
	val.MethodByName("SetAgeAndName").Call(params)
}


